Time update: May 24, 2021
Author: Inayatus
import pandas as pd
import matplotlib as plt
Seperti yang sudah kita ketahui, tahun 2020 merupakan tahun yang cukup membuat kita semua merasa terkejut, sedih, marah, pasrah dikarenakan adanya pandemi dari virus Sars-Cov-2 atau yang lebih sering kita kenal sebagai COVID-19. Pandemi ini sangat menggemparkan dunia dengan penyebaran virusnya yang sangat cepat dan masif menyebabkan jutaan orang sakit, meninggal, harus melakukan karantina diri, dan bahkan miliyaran orang harus mengalami perubahan pada hidupnya, baik dalam bersosial, bekerja, bahkan beraktifitas seperti biasanya. Walaupun pandemi ini masih terus berlangsung, para ilmuan dan peneliti dalam satu tahun terakhir ini telah mempu menemukan vaksin yang telah melalui beberapa uji klinis - terima kasih.
Terdapat beberapa jenis vaksin yang telah di uji dan telah di distribusikan oleh beberapa negara, termasuk Indonesia. Pada analisis kali ini, kita akan melihat bagaimana perkembangan proses vaksinasi di dunia terutama di Indonesia. Vaksin apa saja yang paling banyak digunakan di seluruh dunia? Vaksin apa yang digunakan oleh Indonesia? Negara mana yang menggunakan jenis vaksin yang sama dengan Indonesia? Negara mana yang sudah hampir menyelesaikan proses vaksinasi bagi para penduduknya dan bagaimana progres distribusi vaksin di Indonesia?
Beberapa pertanyaan tersebut akan kita jawab. Untuk menjawab pertanyaan tersebut, disini kita akan menggunakan data vaksin yang bersumber dari Kaggle: COVID-19 World Vaccination Progress dan data orisinil diperoleh dari Our World in Data serta repositori Github COVID-19.
Kita akan coba melakukan import data country_vaccinations.csv yang tersimpan dalam folder data_input. Dikarenakan file dalam bentuk .csv, kita bisa menggunakan fungsi pd.read_csv().
vaksin = pd.read_csv("data_input/country_vaccinations.csv")
vaksin.head()
| country | iso_code | date | total_vaccinations | people_vaccinated | people_fully_vaccinated | daily_vaccinations_raw | daily_vaccinations | total_vaccinations_per_hundred | people_vaccinated_per_hundred | people_fully_vaccinated_per_hundred | daily_vaccinations_per_million | vaccines | source_name | source_website | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Afghanistan | AFG | 2021-02-22 | 0.0 | 0.0 | NaN | NaN | NaN | 0.0 | 0.0 | NaN | NaN | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... | World Health Organization | https://covid19.who.int/ |
| 1 | Afghanistan | AFG | 2021-02-23 | NaN | NaN | NaN | NaN | 1367.0 | NaN | NaN | NaN | 35.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... | World Health Organization | https://covid19.who.int/ |
| 2 | Afghanistan | AFG | 2021-02-24 | NaN | NaN | NaN | NaN | 1367.0 | NaN | NaN | NaN | 35.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... | World Health Organization | https://covid19.who.int/ |
| 3 | Afghanistan | AFG | 2021-02-25 | NaN | NaN | NaN | NaN | 1367.0 | NaN | NaN | NaN | 35.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... | World Health Organization | https://covid19.who.int/ |
| 4 | Afghanistan | AFG | 2021-02-26 | NaN | NaN | NaN | NaN | 1367.0 | NaN | NaN | NaN | 35.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... | World Health Organization | https://covid19.who.int/ |
Data tersebut menyimpan informasi sebagai berikut:
Tahapan yang cukup penting yaitu melakukan pembersihan data agar dapat digunakan dalam analisis lanjutan.
Pertama kita cek terlebih dahulu tipe data masing-masing kolom pada data vaksin.
vaksin.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 17607 entries, 0 to 17606 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 country 17607 non-null object 1 iso_code 17607 non-null object 2 date 17607 non-null object 3 total_vaccinations 10251 non-null float64 4 people_vaccinated 9526 non-null float64 5 people_fully_vaccinated 7185 non-null float64 6 daily_vaccinations_raw 8568 non-null float64 7 daily_vaccinations 17391 non-null float64 8 total_vaccinations_per_hundred 10251 non-null float64 9 people_vaccinated_per_hundred 9526 non-null float64 10 people_fully_vaccinated_per_hundred 7185 non-null float64 11 daily_vaccinations_per_million 17391 non-null float64 12 vaccines 17607 non-null object 13 source_name 17607 non-null object 14 source_website 17607 non-null object dtypes: float64(9), object(6) memory usage: 2.0+ MB
Pada data vaksin, terdapat 2 jenis tipe data yang disajikan yaitu numeric (float) dan character (object). Namun apabila kita teliti lebih dalam, setiap kolom pada data vaksin ada yang belum memiliki tipe data yang sesuai. Kolom mana yang perlu diubah?
date -> tipe data datetimecountry, iso_code, source_name -> tipe data categoricvaksin_clean = vaksin.copy()
# datetime
vaksin_clean['date'] = pd.to_datetime(vaksin_clean['date'])
# category
cat_cols = ['country','iso_code','source_name']
vaksin_clean[cat_cols] = vaksin_clean[cat_cols].astype('category')
vaksin_clean.dtypes
country category iso_code category date datetime64[ns] total_vaccinations float64 people_vaccinated float64 people_fully_vaccinated float64 daily_vaccinations_raw float64 daily_vaccinations float64 total_vaccinations_per_hundred float64 people_vaccinated_per_hundred float64 people_fully_vaccinated_per_hundred float64 daily_vaccinations_per_million float64 vaccines object source_name category source_website object dtype: object
Hal yang paling krusial dalam melakukan analisis data yaitu terdapatnya missing value atau nilai kosong. Sekilas jika kita perhatikan terdapat missing value pada beberapa kolom, namun kita tidak tahu kolom mana yang paling banyak terdapat missing valuenya, dan berapa proporsi missing value yang ada pada masing-masing kolom.
na = pd.DataFrame(vaksin_clean.isna().sum()/vaksin_clean.shape[0])
na = na.sort_values(by = 0, ascending = True)*100
na.rename(columns = {0 : 'percent'}, inplace =True)
na
| percent | |
|---|---|
| country | 0.000000 |
| iso_code | 0.000000 |
| date | 0.000000 |
| vaccines | 0.000000 |
| source_name | 0.000000 |
| source_website | 0.000000 |
| daily_vaccinations | 1.226785 |
| daily_vaccinations_per_million | 1.226785 |
| total_vaccinations | 41.778838 |
| total_vaccinations_per_hundred | 41.778838 |
| people_vaccinated | 45.896518 |
| people_vaccinated_per_hundred | 45.896518 |
| daily_vaccinations_raw | 51.337536 |
| people_fully_vaccinated | 59.192367 |
| people_fully_vaccinated_per_hundred | 59.192367 |
import plotly.express as px
fig = px.bar(na, x = 'percent' , y=na.index,
title="Persentase Missing Value per Kolom",
orientation='h')
fig.show()
Dari sini kita tahu bahwa beberapa kolom memiliki missing value lebih dari 50%, kita bisa menghapus kolom tersebut karena terlalu banyak yang missing. Untuk kolom yang memiliki missing value lebih sedikit bisa kita imputasi sesuai dengan keputusan bisnis atau tetap kita biarkan missing apabila tidak kita perlukan kolom tersebut.
Pada analisis ini kita akan memilih beberapa kolom yang diperlukan saja untuk analisis diantaranya country, date, vacciness, daily_vaccinations, total_vaccinations, people_vaccinated, daily_vaccinations_raw, people_vaccinated_per_hundred, dan people_fully_vaccinated. Dikarenakan data tersusun per hari, oleh karena itu menyebabkan beberapa data missing dikarenakan memang tidak terdapat kegiatan vaksinasi. Beberapa kolom yang terdapat missing value akan kita isi dengan angka 0.
vaksin_clean = vaksin_clean[['country', 'date', 'total_vaccinations', 'daily_vaccinations', 'daily_vaccinations_raw', 'people_vaccinated', 'people_fully_vaccinated', 'people_fully_vaccinated_per_hundred', 'vaccines']]
vaksin_clean[['total_vaccinations', 'daily_vaccinations', 'daily_vaccinations_raw', 'people_vaccinated', 'people_fully_vaccinated', 'people_fully_vaccinated_per_hundred']] = vaksin_clean[['total_vaccinations', 'daily_vaccinations', 'daily_vaccinations_raw', 'people_vaccinated', 'people_fully_vaccinated', 'people_fully_vaccinated_per_hundred']].fillna(0)
vaksin_clean.head()
| country | date | total_vaccinations | daily_vaccinations | daily_vaccinations_raw | people_vaccinated | people_fully_vaccinated | people_fully_vaccinated_per_hundred | vaccines | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Afghanistan | 2021-02-22 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... |
| 1 | Afghanistan | 2021-02-23 | 0.0 | 1367.0 | 0.0 | 0.0 | 0.0 | 0.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... |
| 2 | Afghanistan | 2021-02-24 | 0.0 | 1367.0 | 0.0 | 0.0 | 0.0 | 0.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... |
| 3 | Afghanistan | 2021-02-25 | 0.0 | 1367.0 | 0.0 | 0.0 | 0.0 | 0.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... |
| 4 | Afghanistan | 2021-02-26 | 0.0 | 1367.0 | 0.0 | 0.0 | 0.0 | 0.0 | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... |
Sebelum melangkah lebih jauh, kita akan cari tahu dulu, data yang kita miliki berada pada rentang waktu kapan.
vaksin_clean['date'].describe()
/home/inayatus/miniconda3/envs/algoritma/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: Treating datetime data as categorical rather than numeric in `.describe` is deprecated and will be removed in a future version of pandas. Specify `datetime_is_numeric=True` to silence this warning and adopt the future behavior now.
count 17607 unique 163 top 2021-04-08 00:00:00 freq 186 first 2020-12-02 00:00:00 last 2021-05-13 00:00:00 Name: date, dtype: object
Data vaksin yang kita miliki memiliki rentang waktu 2 Desember 2020 - 13 Mei 2021.
Hinggal 15 Mei 2021, para peneliti telah melakukan pengujian 90 vaksin pada tenaga kesehatan, dan 27 vaksin sudah mencapai tahapan final test. Terdapat 77 vaksin praklinis sedang dalam pengujian pada hewan. Sumber: The New York Times.
vaksin_per_country = vaksin_clean[['country', 'vaccines']].drop_duplicates()
total_vaksin = vaksin_per_country['vaccines'].str.split(', ', expand=True).stack().value_counts().to_frame(name='total')
total_vaksin
| total | |
|---|---|
| Oxford/AstraZeneca | 164 |
| Pfizer/BioNTech | 99 |
| Moderna | 47 |
| Sinopharm/Beijing | 45 |
| Sputnik V | 37 |
| Sinovac | 26 |
| Johnson&Johnson | 18 |
| Covaxin | 5 |
| CanSino | 2 |
| EpiVacCorona | 2 |
| Sinopharm/Wuhan | 2 |
| Abdala | 1 |
Hingga 13 Mei 2021, 5 jenis vaksin yang paling banyak digunakan oleh banyak negara di dunia yaitu vaksin Oxford/AstraZaneca, Pfizer/BioNTech, Modernam, Sinopharm, dan Sputnik V. Indonesia sendiri sudah menggunakan vaksin Sinovac yang berada pada urutan ke-6 jenis vaksin yang paling sering digunakan oleh beberapa negara. Namun, selain Sinovac, Indonesia juga sudah menggunakan jenis vaksin dari Astrazeneca.
vaksin_clean[vaksin_clean['country'] == 'Indonesia'][['country', 'vaccines']].drop_duplicates()
| country | vaccines | |
|---|---|---|
| 7350 | Indonesia | Oxford/AstraZeneca, Sinovac |
Kedua jenis vaksin ini telah digunakan oleh beberapa negara. Berikut ini beberapa negara yang menggunakan jenis vaksin yang sama dengan Indonesia.
# code here
vaksin_per_country[vaksin_per_country['vaccines'].str.contains('AstraZeneca|Sinovac')]
| country | vaccines | |
|---|---|---|
| 0 | Afghanistan | Oxford/AstraZeneca, Pfizer/BioNTech, Sinopharm... |
| 79 | Albania | Oxford/AstraZeneca, Pfizer/BioNTech, Sinovac, ... |
| 224 | Andorra | Oxford/AstraZeneca, Pfizer/BioNTech |
| 330 | Angola | Oxford/AstraZeneca |
| 403 | Anguilla | Oxford/AstraZeneca |
| ... | ... | ... |
| 17247 | Vietnam | Oxford/AstraZeneca |
| 17313 | Wales | Moderna, Oxford/AstraZeneca, Pfizer/BioNTech |
| 17443 | Wallis and Futuna | Oxford/AstraZeneca |
| 17493 | Yemen | Oxford/AstraZeneca |
| 17494 | Zambia | Oxford/AstraZeneca |
169 rows × 2 columns
Lalu bagaimana sebenarnya perkembangan distribusi vaksin antar negara terutama di Indonesia? Apakah sudah mencapai 100%?
vaksin_indo = vaksin_clean[vaksin_clean['country']=="Indonesia"]
# visualize
import plotly.graph_objs as go
fig = go.Figure()
fig.add_trace(go.Scatter(x = vaksin_clean['date'], y = vaksin_clean['daily_vaccinations'], mode = "lines",
text = vaksin_clean['country'], hovertemplate = '%{text}'+'<br>'+"tanggal = %{x}"+'<br>'+'Vaksin per Hari = %{y}'))
fig.add_trace(go.Scatter(x = vaksin_indo['date'], y = vaksin_indo['daily_vaccinations'], mode = "lines",
text = "Indonesia", hovertemplate = "tanggal = %{x}"+'<br>'+'Vaksin per Hari = %{y}'))
fig.show()